package br.com.sis.rh.action;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.sis.rh.entity.Candidato;
import br.com.sis.rh.entity.Pos;
import br.com.sis.rh.entity.PosGraduacaoProfissional;
import br.com.sis.rh.entity.TipoCursoPos;
import br.com.sis.rh.facade.CandidatoFacade;
import br.com.sis.rh.facade.PosGraduacaoFacade;
import br.com.sis.rh.facade.TipoCursoPosFacade;
import br.com.sis.rh.vo.RetornoAjaxVO;

@Controller
@Scope("request")
@ParentPackage("json-default")
@Namespace(value = "/")
public class PosAction extends ComumAuxAction implements ComumAction {

	@Autowired
	private CandidatoFacade candidatoFacade;
	
	@Autowired
	private PosGraduacaoFacade posGraduacaoFacade;
	
	@Autowired
	private TipoCursoPosFacade tipoCursoPosFacade;
	
	private Candidato candidato;

	private PosGraduacaoProfissional posGraduacaoProfissional;
	
	private RetornoAjaxVO retornoAjax;
	
	private String tipoCursoPosId;
	
	@Override
	public String incluir() {
		return null;
	}

	@Override
	@Action(value="alterarPosGraduacaoCandidato", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String alterar() {

		retornoAjax = new RetornoAjaxVO();
		
		posGraduacaoFacade.alterar(posGraduacaoProfissional);
		
		retornoAjax.setObjetoRetornado(carregaListaPosGraduacaoAux());
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}

	@Override
	@Action(value="excluirPosGraduacaoProfissional", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String excluir() {
		
		retornoAjax = new RetornoAjaxVO();
		
		posGraduacaoFacade.excluir(posGraduacaoProfissional);

		retornoAjax.setObjetoRetornado(carregaListaPosGraduacaoAux());
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}

	@Override
	@Action(value="listarPosGraduacaoProfissional", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String listar() {
		retornoAjax = new RetornoAjaxVO();
		
		retornoAjax.setObjetoRetornado(carregaListaPosGraduacaoAux());
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	@Action(value="incluirPosGraduacaoCandidato", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String incluirPosGraduacaoCandidato() {
		
		retornoAjax = new RetornoAjaxVO();
		
		Set<PosGraduacaoProfissional> posGraduacaoProfissionais = new HashSet<>();
			
		posGraduacaoProfissionais.add(posGraduacaoProfissional);
			
		candidato.setPosGraduacaoProfissional(posGraduacaoProfissionais);
			
		candidatoFacade.incluirPosGraduacao(candidato);
		
		Candidato listaRetorno = carregarListaPorCandidato(candidato, "posGraduacaoProfissional");
		
		List<PosGraduacaoProfissional> listaPosGraduacaoNova = new ArrayList<>(listaRetorno.getPosGraduacaoProfissional());
		
		retornoAjax.setObjetoRetornado(listaPosGraduacaoNova);
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	@Action(value="recuperarPosGraduacao", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String carregarPosGraduacaoPorId() {
		
		retornoAjax = new RetornoAjaxVO();
		
		retornoAjax.setObjetoRetornado(posGraduacaoFacade.recuperarObjetoPorID(posGraduacaoProfissional));
		retornoAjax.setStatusOperacao(SUCCESS);
		
		return SUCCESS;
	}
	
	@Action(value="carregarComboPorTipoPos", results={
			@Result(name="success", type="json", params={"root","retornoAjax"})
	})
	public String carregarComboPorTipoPos() {
		retornoAjax = new RetornoAjaxVO();
		
		TipoCursoPos tipoCursoPos = new TipoCursoPos();
		
		tipoCursoPos.setId(Integer.valueOf(tipoCursoPosId));
		
		TipoCursoPos tcp = tipoCursoPosFacade.carregarCursosPos(tipoCursoPos);
		
		List<Pos> listaPos = new ArrayList<Pos>(tcp.getPos());
		
		retornoAjax.setObjetoRetornado(listaPos);
		
		return SUCCESS;
	}
	
	private List<PosGraduacaoProfissional> carregaListaPosGraduacaoAux() {
		Candidato listaRetorno = carregarListaPorCandidato(candidato, "posGraduacaoProfissional");
		
		if(listaRetorno != null) {
			return new ArrayList<>(listaRetorno.getPosGraduacaoProfissional());	
		} else {
			return new ArrayList<>();
		}
	}

	public RetornoAjaxVO getRetornoAjax() {
		return retornoAjax;
	}

	public void setRetornoAjax(RetornoAjaxVO retornoAjax) {
		this.retornoAjax = retornoAjax;
	}

	public String getTipoCursoPosId() {
		return tipoCursoPosId;
	}

	public void setTipoCursoPosId(String tipoCursoPosId) {
		this.tipoCursoPosId = tipoCursoPosId;
	}

	public Candidato getCandidato() {
		return candidato;
	}

	public void setCandidato(Candidato candidato) {
		this.candidato = candidato;
	}

	public PosGraduacaoProfissional getPosGraduacaoProfissional() {
		return posGraduacaoProfissional;
	}

	public void setPosGraduacaoProfissional(
			PosGraduacaoProfissional posGraduacaoProfissional) {
		this.posGraduacaoProfissional = posGraduacaoProfissional;
	}
}
